Работа с read view через Lua API¶
В этом руководстве описано, как с помощью Lua API открыть представление для чтения, получить данные из этого представления и закрыть его. Полный справочник по API приведен в разделе Read views: Lua API в документации Tarantool Enterprise.
Руководство включает следующие шаги:
Создание спейса¶
Сначала нужно создать спейс, с которым будет использоваться read view.
Создайте спейс bands
:
bands = box.schema.space.create('bands')
Задайте формат спейса:
box.space.bands:format({
{ name = 'id', type = 'unsigned' },
{ name = 'band_name', type = 'string' },
{ name = 'year', type = 'unsigned' }
})
Создайте первичный и вторичные индексы:
box.space.bands:create_index('primary', { parts = { 'id' } })
box.space.bands:create_index('band', { parts = { 'band_name' } })
box.space.bands:create_index('year', { parts = { { 'year' } }, unique = false })
Добавьте в спейс несколько групп:
bands:insert { 1, 'Roxette', 1986 }
bands:insert { 2, 'Scorpions', 1965 }
bands:insert { 3, 'Ace of Base', 1987 }
bands:insert { 4, 'The Beatles', 1960 }
Создание представления для чтения¶
Создать read view можно с помощью функции box.read_view.open():
rv:instance001> rv = box.read_view.open({ name = 'rv' })
Здесь:
rv
– название read view.
Проверить статус read view можно следующим образом:
rv:instance001> rv.status
---
- open
...
Чтобы просмотреть полную информацию о созданном read view, вызовите функцию read_view_object:info():
rv:instance001> rv:info()
---
- timestamp: 66.606817935
signature: 24
is_system: false
status: open
vclock: { 1: 24 }
name: rv
id: 1
...
Чтобы просмотра списка всех созданных read view, используйте функцию box.read_view.list().
Запросы к данным¶
После создания read view обращаться к спейсам можно через поле read_view_object.space.
Поле обеспечивает доступ к объекту спейса с методами select, get
и pairs. Поведение этих методов соответствует методам box.space
.
В примере ниже показано, как выбрать 4 записи из спейса bands
:
rv:instance001> rv.space.bands:select({}, { limit = 4 })
---
- - [ 1, 'Roxette', 1986 ]
- [ 2, 'Scorpions', 1965 ]
- [ 3, 'Ace of Base', 1987 ]
- [ 4, 'The Beatles', 1960 ]
...
Аналогичным образом можно получить данные по определенному индексу:
rv:instance001> rv.space.bands.index.year:select({}, { limit = 4 })
---
- - [ 4, 'The Beatles', 1960 ]
- [ 2, 'Scorpions', 1965 ]
- [ 1, 'Roxette', 1986 ]
- [ 3, 'Ace of Base', 1987 ]
...
Теперь поменяйте данные в спейсе.
Для этого удалите кортеж с id = 4
:
rv:instance001> bands:delete(4)
---
- [ 4, 'The Beatles', 1960 ]
...
Read view содержит снимок данных (snapshot), полученный перед удалением кортежа.
Чтобы проверить это, используйте операцию select
:
rv:instance001> rv.space.bands:select()
---
- - [ 1, 'Roxette', 1986 ]
- [ 2, 'Scorpions', 1965 ]
- [ 3, 'Ace of Base', 1987 ]
- [ 4, 'The Beatles', 1960 ]
Действительно, в снимке есть кортеж с id = 4
.
Закрытие read view¶
Представления для чтения могут занимать значительный объем памяти. Если read view больше не требуется, закройте его с помощью метода read_view_object:close():
rv:close()
Если не закрыть read view таким образом, он закроется неявно, когда сборщик мусора Lua соберет объект read view.
После закрытия read view его статус меняется на closed
.
Попытка использовать закрытый read view вызовет ошибку.